#!usr/bin/env pythion3
# -*- coding:utf-8 -*-

#第三章数字日期和时间

#浮点数的精准计算

from decimal import Decimal,localcontext
a = 4.2
b = 2.6
c = a+b  # 有时候得到的 值是一个 6.800000000000001 并非一个我们想要的值
print(type(a),c) 
a = Decimal("4.2")
b = Decimal("2.6")
c = a+b  # 得到的是一个精准的浮点数6.8
print(type(c),c) 
# decimal取小数点后几位

with localcontext() as lct:
    lct.prec = 10 # 表示得到的数值总长度     
    print(a/b)

# 进制转换

x = 12

binVal = bin(x)
octVal = oct(x)
hexVal = hex(x)
print(binVal,octVal,hexVal)

print(format(x,'b'),format(x,'o'),format(x,'x'))

y = int(binVal,2) # 把二进制转换成10进制 其他的类似
print(y,y.to_bytes(4,'big'))

#2017年6月5日 16:00 p96

#分数计算
from fractions import Fraction
a = Fraction(5,4) # 5/4 表示四分之五
b = Fraction(7,5)
print(a+b)

#随机问题

import random

values = [1,2,3,4,5,6]

print(random.choice(values)) # 随机选择一个元素
print(random.sample(values,3)) #随机选择三个元素

random.shuffle(values) #随机打乱列表元素的位置
print(values) # 打乱后输出

n = random.randint(1,10) # 随机生成一个大于等于1并且小于等于10的数
m = random.random() # 随机生成一个小于1大于0的浮点数
print(n,m)

import ssl
print(ssl.RAND_bytes(3)) # 可以创建一个安全的字符串

# 时间日期
from datetime import datetime,timedelta,date
import calendar

d = datetime(2017,6,4)
print(d.today()) # 返回当前时间

td = timedelta(days=2,hours=2)

print(d,d+td,td.seconds) # 2017年6月6日14:01:59 p107

def get_month_range(start_date=None):
    if start_date==None:
        start_date = date.today().replace(day=1) #设置为该月的1号
    _,daysInMonth  = calendar.monthrange(start_date.year,start_date.month)
    end_date = start_date+timedelta(days=daysInMonth)
    return (start_date,end_date)
a_day = timedelta(days=1)
first,end = get_month_range()
while(first<end):
    #print(first)
    first+=a_day


print(calendar.monthrange(2017,6))  # calendar.monthrange(2017,6) 返回 2017年6月的第一天是星期几（星期一是0）和该月总天数

#字符串转换成日期

dateStr = "2017-6-7"

dt = datetime.strptime(dateStr,'%Y-%m-%d')  
print(dt,type(dt))

#时区 需要安装 pytz 模块


